package com.xcy.goatmilk.util.scheduleTask;

import com.xcy.goatmilk.mapper.IncomeMapper;
import com.xcy.goatmilk.mapper.TaskMapper;
import com.xcy.goatmilk.pojo.Task;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import org.springframework.scheduling.support.CronTrigger;
import org.springframework.util.Assert;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;

import java.time.LocalDateTime;
import java.util.List;

/**
 * @author xcy
 * @Description 实现动态定时任务，数据库cron一旦修改，则自动获取最新最新的配置cron进行执行。
 *              缺点：cron一点修改错误，则不能正常运行，即使改对了，还是不能正常运转。
 * @date 2022/4/24 0:25
 */
@Configuration
@EnableScheduling
public class MyTask implements SchedulingConfigurer {

    @Autowired
    private TaskMapper taskMapper;

    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        taskRegistrar.addTriggerTask(
                // 执行任务
                () -> System.out.println("\n-->动态定时任务执行 " + LocalDateTime.now().toLocalTime()),

                triggerContext -> {
                    // 从数据库获取执行周期
                    List<Task> tasks = taskMapper.selectTask();
                    Assert.isTrue(!CollectionUtils.isEmpty(tasks), "数据库没有设置定时任务。");
                    Task task = tasks.get(0);
                    String cron = task.getCron();

                    System.out.println("-->从数据库获取到的cron = " + cron);

                    if (!StringUtils.hasText(cron)) {
                        System.out.println("没有设置定时任务。");
                    }
                    // 返回执行周期（Date）
                    return new CronTrigger(cron).nextExecutionTime(triggerContext);

                }

        );
    }
}
